CSS 简介

CSS (Cascading Style Sheets) 用来设定网页元素的外观和布局(layout)。

通俗的说,就是让你的网页更好看。

比如:设置 字体、颜色、大小、间距,网页里面 标题栏 导航栏 主体 页尾 这些部分的布局位置 等等


其实前面,我们就已经接触过 CSS 的语法,如下

<p class="title" style='color:green; font-size: 20px;'>白月黑羽日活用户突破3万</p>

这里面 style='color:green; font-size: 20px;' 就是css语句

color:green 告诉浏览器,这个元素里面的文字颜色是绿色,

font-size: 20px 指明了 文字大小为 20个像素

CSS语句的位置

内联CSS

上面示例中, css描述 就写在它针对的元素里面,作为元素的 style 属性,所以 称之为 内联(inline style) 样式。

这种内联在元素里面的好处是:无需指定样式是针对哪个HTML元素的,在哪个元素里面,就是修饰哪个元素的。


但也有缺点:

  • 缺点1: 不能批量指定

比如

<p class="title" style='color:green; font-size: 20px;'>白月黑羽日活用户突破3万</p>
<p class="title" style='color:green; font-size: 20px;'>祝贺小班学员刘启明跳槽成功,薪资提升60%</p>
<p class="title" style='color:green; font-size: 20px;'>和小班学员交流英文对编程的重要性</p>

上面3条新闻的样式都是一样的,但是却要写3遍,太麻烦了! 如果有100条,难道要写100遍?

而且如果要修改,也要全部都修改。


  • 缺点2: 样式(style) 和 页面结构(structure) 混在一起,使得页面HTML看起来杂乱不清晰。

所以,我们推荐 把style 分离出来,作为单独的 样式表(CSS)。


单独的CSS 可以放在head里面,也可以作为外部 CSS 文件 被页面引用。

head 里的 CSS

CSS 可以放在head里面,像这样

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>白月黑羽web教学</title>
  <style>
    p {
      color:green; font-size: 20px;
    }
  </style>
</head>

<body>

<h1>今日新闻</h1>
<p id='t1' class="title">白月黑羽日活用户突破3万</p>
<p id='t2' class="title">祝贺小班学员刘启明跳槽成功,薪资提升60%</p>
<p id='t3' class="title">和小班学员交流英文对编程的重要性</p>

</body>
</html>

比起 内联的 CSS, 只要指定一次即可 。

怎么做到的?

仔细看,样式放在一个花括号里面,花括号前的表达式 (本例中就是一个p), 称之为 selector 选择器

这个 selector 非常重要,它指定了花括号里面的 样式 是针对哪些元素 的。

如果我们把上例中的 p 改为 h1 , 就会发现它 改变了 h1 的样式。


也可以根据id的值 选择元素

#t1 {
  color:green; font-size: 20px;
}

根据 id 选择,前面要加一个井号


也可以根据class的值 选择元素

.title {
  color:green; font-size: 20px;
}

根据 class 选择,前面要加一个点


selector 表达式的选择语法 非常强大灵活,后面的教程会有详细的讲解。

外部CSS文件

我们还可以把CSS内容放到另外一个文件,比如 style.css,像这样

/* style.CSS 文件的内容 */
p {
  color:green; font-size: 20px;
}

然后在HTML页面文件中,指定外部CSS 的链接地址,如下

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>白月黑羽web教学</title>
  <!-- 这里指定外部css地址 -->
  <link rel="stylesheet" href="styles.css">
</head>
<body>

<h1>今日新闻</h1>
<p class="title">白月黑羽日活用户突破3万</p>
<p class="title">祝贺小班学员刘启明跳槽成功,薪资提升60%</p>
<p class="title">和小班学员交流英文对编程的重要性</p>

</body>
</html>

那什么时候 CSS 应该 放在 head 里,什么时候应该放在 外部文件呢?

如果 是下面这些情况,推荐放在外部

  • CSS 内容特别多

    放在网页中会使得网页文件特别臃肿

  • CSS 内容对多个网页都适用

    这时 CSS 独立出来,只需维护一份就可以,避免了重复性

CSS 注释

CSS 的注释 可以像下面这样

/* style.css 文件的内容 */

p {
  color:green; font-size: 20px;
}

h1 {
  /* 不使用缺省大小,
  保证一致性 */
  color:green; font-size: 20px;
}

如果使用vscode ,选中要注释的内容 按 Ctrl 键 和 / 斜杆键,就可以 自动产生注释了

div 元素

网页中 div (Division) 元素 非常常见。

它主要的作用是作为 一批html元素的 容器,把它们包含在内。

然后对这个 div 元素做 CSS 样式指定,这样就对 该div包含的内部元素整体 做CSS样式的指定了。

比如

<h3>我们的教程有</h3>
<div style='border: 2px solid green; margin: 30px; padding: 20px; width:100px'>
  <p>白月黑羽<mark>Python</mark>教程</p>
  <p>白月黑羽<mark>自动化测试</mark>教程</p>
  <p>白月黑羽<mark>前端开发</mark>教程</p>
</div>

其中

  • border: 2px solid green 为 div元素设置边框,包围了整个div(包括内部元素)

  • margin: 30px; padding: 20px 指定外边距为 30px ,内边距为20px

    大家可以修改一下值,看看显示上面的区别。

    内外边距的概念,后面教程会有进一步的讲解

  • width:100px 指定div宽度为 100px,

    所有内部的元素也受其影响,内容超过这个长度,就自动换行显示


如果不对div元素做任何的CSS设置, div 内部的这些元素,显示上没有什么不同。

浏览器查看修改 HTML/CSS

前端开发时,我们经常发现元素的显示效果和需要的有差异。

这时,需要在浏览器 查看、修改 HTML元素和CSS。

可以在浏览器里 按F12,打开开发者工具栏进行查看和调整 CSS

具体操作请看视频讲解

CSS 优先规则

有时你会发现,你写的针对元素的 CSS, 实际运行时,却不起作用。

原因往往是:你的代码中 存在 多个 适用于同一元素的 css规则,你期望生效的那个规则优先级没有另外一个高。

所以你要知道 css 规则的优先级

声明次序

如果你不小心写了下面这样的 html/css


<head>
  <style>
    h1 { 
      color: red; 
    }

    /* 这里 省略一批其它的css规则 */

    h1 { 
      color: green; 
    }   
  </style>
</head>

<body>
  <h1>白月黑羽今日信息</h1>
</body>


可以发现后面的规则覆盖了前面的规则

就像 皇帝的圣旨都是 后旨压前旨 一样,后出现的规则 优先级高于 前面的规则

具体性

看下面这个例子


<head>
  <style>
    .main-heading { 
      color: red; 
    }

    h1 { 
      color: green; 
    }   
  </style>
</head>

<body>
  <h1 class="main-heading">白月黑羽今日信息</h1>
</body>


为什么 最后生效的规则是第一个,而不是第二个呢?

因为 通过 class 属性选择元素, 比通过标签名指定元素,更加的 具体确定, 范围更小,所以优先级高。

选择元素的 表达式 越具体, 优先级越高


再看这个例子


<head>
  <style>   
    .main-heading { 
      color: green; 
    }
  </style>
</head>

<body>
  <h1 class="main-heading" style="color:red">白月黑羽今日信息</h1>
</body>


为什么 最后生效的规则是内联CSS,而不是头部里面的CSS呢?

因为 内联 比头部指定 更具体(想一想为什么?), 所以优先级高。

优先级规则是: 内联 > head > 外部CSS

继承性

有些CSS 特性 设置在上层 元素,会被下层元素 继承,比如 colorfont-family

比如:


<body style="color: green;">
    <h3>白月黑羽 实战班</h3>

    <p style="color: blue">不是 上大班课的学习方式
        我们是 
        <span style="color: red">定制学习 + 实战练习 + 1对1 指导答疑</span>.
    </p>
</body>  


如果我们去掉 span 里面的 color设置,如下


<body style="color: green;">
    <h3>白月黑羽 实战班</h3>

    <p style="color: blue">不是 上大班课的学习方式
        我们是 
        <span>定制学习 + 实战练习 + 1对1 指导答疑</span>.
    </p>
</body>  

就可以发现,span元素继承了 p 里面指定的color,因为内部元素会继承上层元素的属性。


如果我们去掉 p 里面的 color设置,如下


<body style="color: green;">
    <h3>白月黑羽 实战班</h3>

    <p>不是 上大班课的学习方式
        我们是 
        <span>定制学习 + 实战练习 + 1对1 指导答疑</span>.
    </p>
</body>  

就可以发现,span元素继承了 body 里面指定的color


有这样的优先性规则:越靠近该元素的CSS指定,优先级越高

所以,body、p 同时指定color时, 更靠近 span 的 p 的CSS 赢得优先

body、p、span 同时指定color时, span 自身的CSS 赢得优先


但是有些CSS 特性是不能被继承的,比如 width

如果一个 上层div元素的 设置了 width1000px

内部元素 不会继承 这个特性,否则内部的图片/视频/p等等全都是 1000px宽度,就乱套了

还是以上面的代码为例


<h3>我们的教程有</h3>
<div style='border: 2px solid green; margin: 30px; padding: 20px; width:100px'>
  <p>白月黑羽<mark>Python</mark>教程</p>
  <p>白月黑羽<mark>自动化测试</mark>教程</p>
  <p>白月黑羽<mark>前端开发</mark>教程</p>
</div>

可以发现 width , margin, padding, border 是不会被继承的,否则下面的元素都会有相同的 宽度 边框 间距 了


!important

再看这个例子


<head>
  <style>   
    h1 { 
      color: green; 
    }
  </style>
</head>

<body>
  <h1 class="main-heading" style="color:red">白月黑羽今日信息</h1>
</body>


前面说过,优先级规则是: 内联 > head > 外部CSS

但是如果你想专门把 head里面的这个 color CSS 优先级 提高,

可以在head里面使用 !important 提高其优先级

这样


<head>
  <style>   
    h1 { 
      color: green !important;
    }
  </style>
</head>

<body>
  <h1 class="main-heading" style="color:red">白月黑羽今日信息</h1>
</body>

就会发现,head里面的设置覆盖了内联 指定。